package org.example.classtopia.Mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.example.classtopia.Model.Entity.Course;

import java.time.LocalTime;
import java.util.List;

@Mapper
public interface CourseMapper {

    // 插入新课程
    int insertCourse(Course course);

    // 根据ID查询课程
    Course selectCourseById(@Param("id") Long id);

    List<Course> selectCourseByUserIdAndSemester(
            @Param("userId") Long userId,
            @Param("semester") String semester);
    /**
     * 根据用户ID、学期和周次查询该周所有课程
     * @param userId 用户ID
     * @param semester 学期，如"2023-1"
     * @param week 学期中的第几周
     * @return 该周所有课程列表
     */

    List<Course> selectCoursesByUserAndWeekAndDay(
            @Param("userId") Long userId,
            @Param("semester") String semester,
            @Param("week") Integer week,
            @Param("day") Integer day
    );

    List<Course> selectCoursesByUserAndWeek(
            @Param("userId") Long userId,
            @Param("semester") String semester,
            @Param("week") Integer week);

    // 更新课程信息
    int updateCourse(Course course);

    // 逻辑删除课程（status字段修改为0）
    int deleteCourseById(@Param("id") Long id);

    // 排除id参数用于更新时排除自己
    int countConflicts(
            @Param("userId") Long userId,
            @Param("semester") String semester,
            @Param("dayOfWeek") Integer dayOfWeek,
            @Param("startWeek") Integer startWeek,
            @Param("endWeek") Integer endWeek,
            @Param("startTime") String startTime,
            @Param("endTime") String endTime,
            @Param("excludeId") Long excludeId);

    // 新增方法查询当天指定用户当天课堂，并限定10分钟时间窗口的日程事件
    List<Course> selectSchedulesStartingToday(
            @Param("userId") Long userId,
            @Param("semester") String semester,
            @Param("currentWeek") Integer currentWeek,
            @Param("currentDayOfWeek") Integer currentDayOfWeek,
            @Param("startTime") LocalTime startTime,
            @Param("endTime") LocalTime endTime
    );

    // 新增修改提醒状态方法
    int updateIsReminded(@Param("id") Long id, @Param("isReminded") Integer isReminded);

    /**
     * 查询指定时间段与周次和星期匹配的冲突课程
     *
     * @param userId    用户ID
     * @param fromWeek  起始周次
     * @param toWeek    结束周次
     * @param dayOfWeek 星期几（1~7）
     * @param startTime 起始时间（HH:mm格式）
     * @param endTime   结束时间（HH:mm格式）
     * @return 冲突的课程列表
     */
    List<Course> selectConflicts(
            @Param("userId") Long userId,
            @Param("fromWeek") Integer fromWeek,
            @Param("toWeek") Integer toWeek,
            @Param("dayOfWeek") Integer dayOfWeek,
            @Param("startTime") String startTime,
            @Param("endTime") String endTime
    );
}

